home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / dtst20.zip / ABS4READ.C next >
C/C++ Source or Header  |  1990-05-01  |  4KB  |  148 lines

  1. #pragma inline
  2. /*
  3.     abs4read.c - Turbo C 2.0
  4.  
  5.     abs4read / abs4write functions supporting DOS 4.x and COMPAQ 3.31
  6.     with partitions > 32 MB in addition to previous versions of DOS.
  7.  
  8.     Christopher Blum            CompuServe 76625,1041
  9.     1022 East Wayne Avenue
  10.     Wooster, Ohio 44691
  11.  
  12.     *** prototypes in dos.h must be as follows: ***
  13.  
  14. int _Cdecl abs4read (int drive, int nsects, long lsect, void *buffer);
  15.                                            ****
  16.  
  17. int _Cdecl abs4write(int drive, int nsects, long lsect, void *buffer);
  18.                                            ****
  19.  
  20. */
  21.  
  22. #include <dos.h>
  23. #include <errno.h>
  24.  
  25. static struct {                         /* packet for DOS 4.0 */
  26.     long sect;
  27.     int cnt;
  28.     void far *buf;
  29. } d_4;
  30.  
  31. int abs4read(int drive, int nsects, long lsect, void *buffer)
  32. {
  33.     _AX = _version;                     /* check DOS version */
  34.     asm cmp al,3;
  35.     asm ja new;
  36.     asm jb old;
  37.     asm cmp ah,30;
  38.     asm ja new;
  39.  
  40. old:    /* code for prior versions of DOS - use registers */
  41.  
  42. #if defined(__LARGE__) || defined (__COMPACT__) || defined (__HUGE__)
  43.     asm push ds;
  44.     asm lds bx,buffer;
  45. #else
  46.     asm mov bx,buffer;
  47. #endif
  48.     asm mov cx,nsects;
  49.     asm mov dx,lsect;
  50.     asm mov al,drive;
  51.     asm int 25h;
  52.     asm pop dx;                         /* discard saved flags */
  53. #if defined(__LARGE__) || defined (__COMPACT__) || defined (__HUGE__)
  54.     asm pop ds;
  55. #endif
  56.     asm jmp short done;
  57.  
  58. new:    /* code for DOS 4.0 and Compaq 3.31 - use packet */
  59.  
  60.     d_4.sect = lsect;
  61.     d_4.cnt = nsects;
  62. #if defined(__LARGE__) || defined (__COMPACT__) || defined (__HUGE__)
  63.     d_4.buf = buffer;
  64. #else
  65.     d_4.buf = MK_FP(_DS, buffer);
  66. #endif
  67.     asm lea bx,d_4;
  68.     asm mov cx,-1;
  69.     asm mov al,drive;
  70.     asm int 25h;
  71.     asm pop dx;                         /* discard saved flags */
  72.  
  73. done:
  74.     asm jnc good;                       /* test carry for error */
  75. #if defined (__HUGE__)
  76.     asm mov dx,ax;                      /* huge model trashes ax here */
  77.     errno = _DX;
  78. #else
  79.     errno = _AX;
  80. #endif
  81.     asm mov ax,-1;                      /* bad - set errno, return -1 */
  82.     asm jmp short ret;
  83.     asm cmp si,di;     /* never executed - makes C save reg variables */
  84. good:
  85.     asm xor ax,ax;                      /* good - return 0 */
  86. ret:
  87.     return(_AX);
  88. }
  89.  
  90. int abs4write(int drive, int nsects, long lsect, void *buffer)
  91. {
  92.     _AX = _version;                     /* check DOS version */
  93.     asm cmp al,3;
  94.     asm ja new;
  95.     asm jb old;
  96.     asm cmp ah,30;
  97.     asm ja new;
  98.  
  99. old:    /* code for prior versions of DOS - use registers */
  100.  
  101. #if defined(__LARGE__) || defined (__COMPACT__) || defined (__HUGE__)
  102.     asm push ds;
  103.     asm lds bx,buffer;
  104. #else
  105.     asm mov bx,buffer;
  106. #endif
  107.     asm mov cx,nsects;
  108.     asm mov dx,lsect;
  109.     asm mov al,drive;
  110.     asm int 26h;
  111.     asm pop dx;                         /* discard saved flags */
  112. #if defined(__LARGE__) || defined (__COMPACT__) || defined (__HUGE__)
  113.     asm pop ds;
  114. #endif
  115.     asm jmp short done;
  116.  
  117. new:    /* code for DOS 4.0 and Compaq 3.31 - use packet */
  118.  
  119.     d_4.sect = lsect;
  120.     d_4.cnt = nsects;
  121. #if defined(__LARGE__) || defined (__COMPACT__) || defined (__HUGE__)
  122.     d_4.buf = buffer;
  123. #else
  124.     d_4.buf = MK_FP(_DS, buffer);
  125. #endif
  126.     asm lea bx,d_4;
  127.     asm mov cx,-1;
  128.     asm mov al,drive;
  129.     asm int 26h;
  130.     asm pop dx;                         /* discard saved flags */
  131.  
  132. done:
  133.     asm jnc good;                       /* test carry for error */
  134. #if defined (__HUGE__)
  135.     asm mov dx,ax;                      /* huge model trashes ax here */
  136.     errno = _DX;
  137. #else
  138.     errno = _AX;
  139. #endif
  140.     asm mov ax,-1;                      /* bad - set errno, return -1 */
  141.     asm jmp short ret;
  142.     asm cmp si,di;     /* never executed - makes C save reg variables */
  143. good:
  144.     asm xor ax,ax;                      /* good - return 0 */
  145. ret:
  146.     return(_AX);
  147. }
  148.